//
//  GDMHomeController.swift
//  SinaWeibo
//
//  Created by mac on 15/11/26.
//  Copyright © 2015年 mac. All rights reserved.
//

import UIKit

import AFNetworking

import SVProgressHUD

private let HomeCell = "homeCell"

class GDMHomeController: GDMBasicController {

//    定义一个数组字典的内容
    private lazy var statuses = [GDMHomeStatusModel]()
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        
        if !userLogin {
            
           visitLoginView?.setUpinfo("关注一些人，回这里看看有什么惊喜", imageName: nil)
            
            return
        }
        
//        注册cell
        prepareTableView()

        //        tableView.rowHeight = 200
        //        设置一个预估行高
        tableView.estimatedRowHeight = 300
        tableView.rowHeight = UITableViewAutomaticDimension
        
//visitLoginView?.setUpinfo("关注一些人，回这里看看有什么惊喜", imageName: nil)
        
//        demo()
    
//        加载微博数据
        loadData ()
        
    }

    private func prepareTableView() {
        
//        注册cell
        tableView.registerClass(GDMHomeStatusesCell.self, forCellReuseIdentifier: HomeCell)
    
        refreshControl = UIRefreshControl()
        
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)
        
//        把活动指示器添加到footView上，要是在这里开始启动，一运行就会有两个，避免情况的发生所以就在cell的哪里进行判断
        tableView.tableFooterView = indicatorView
    }
    
//    添加上拉的时候出现那个小菊花，和下拉的那个是不一样的
    private lazy var indicatorView : UIActivityIndicatorView = {
        
       let indicator =  UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        
//        开始运转
//        indicator.startAnimating()
        
       return indicator
        
    }()
    
  @objc private func loadData(){
    
//    开始刷新
    refreshControl?.beginRefreshing()
    
//    如果这两个都设置了，他就会不出来，因为他们两个中间只能设置一个
//    服务器不会返回任何数据
//    所以改成这样的数据
    var since_id = 0
    
    var max_id = 0
    
    if indicatorView.isAnimating() {
        
        since_id = 0
        
//    获取最后面的id
       max_id = statuses.last?.id ?? 0
        
    }else {
        
        max_id = 0
        
      since_id = statuses.first?.id ?? 0
        
    }
    
//    通过这个since_id进行获取好友的数据,进行最后的那一个微博的id
    GDMStatuseListModel.loadData(since_id,max_id: max_id) { (statuses) -> () in
        
//        数据加载完成停止刷新
        self.refreshControl?.endRefreshing()
        
//            根据回调回来内容的时候，拿到用户的信息
        //            print(statuses)
//            判断回来的内容是不是不为空
        guard let list = statuses else {
            
            print(statuses)
            
            SVProgressHUD.showErrorWithStatus("请求失败")
            
            return
        }
      
        //            定义一个数组变量，传递给模型,这个模型就和OC的一样进行一个懒加载
//        在我们下拉刷新的时候，要是直接这样的写的时候是有问题的，这样是只能刷新一组数据，所以在这里就要进行一个拼接的操作
        if since_id > 0 {
            
//            在这里不可以直接使用追加的方式进行，累加，要是使用了刷新出来的数据就会在下面显示
            self.statuses = list + self.statuses
            
        }else if max_id > 0 {
            
//            设置上拉加载更多
            self.statuses += list
            
//            加载完了数据就停止转动，让上一次的数据可以刷新
            self.indicatorView.stopAnimating()
            
        }else{
            
            self.statuses = list
            
        }
        
        //            拿到了模型中的数据，刷新表格
        self.tableView.reloadData()

        }
    
    }

    func demo(){
        
//        加载的适时候就出来那个动画
        SVProgressHUD.show()
        
//        创建一个管理者
        let manager = AFHTTPSessionManager()
        
        let urlStr = "http://www.weather.com.cn/data/sk/101010100.html"
        
//        配置响应回来的内容，缺少的文件
        manager.responseSerializer.acceptableContentTypes?.insert("text/html")
        
//        发送请求
        manager.GET(urlStr, parameters: nil, success: {(task, result) -> Void in

            SVProgressHUD.dismiss()
            
//            使用第三方框架登录成功的时候，让他弹出一个圆圈
            print(result)
            
            }) { (task, error) -> Void in
                
                print(error)
        }
    }
    
//    MARK : 已经封装
    
    func demo1(){
        //    MARK : 获取微博的信息,要是网路不好的时候这个数据就是有可能获取不到，所以这里要是一个可选的类型,因为这个类型是一个字典数组，这个就是要用一个数组包着
        func loadData1(finished : (statuses : [GDMHomeStatusModel]?) -> () ){
            
            //        拿到微博接口的url
            //        https://api.weibo.com/2/statuses/home_timeline.json
            let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
            
            //        拿到地址，发送请求
            let AFN = AFHTTPSessionManager()
            
            guard let token = GDMAccountViewModel().token else {
                
                SVProgressHUD.showErrorWithStatus("你的网络太差了")
                
                return
            }
            
            //        根据微博的token拿到用户的信息,判断用户是否拿到了这个内容，有值的时候在取出值
            let parameters = ["access_token" : token]
            
            AFN.GET(urlString, parameters: parameters, success: { (_, result) -> Void in
                
                //            print(result)
                //            根据这里面的数据，获取我们想要的微博上的内容，把这个内容用一个模型保存起来,拿到对应的数据，可以看到这里面的数据都在statuses里面
                //            现在我们的数据是一个字典类型的数组，所以进行一个判断是不是一个这样的数组，如果是就开始就取下面解析，不是就直接返回
                //            要是直接进行那样判断取出来的是一个字典，但是我们取出来的是一个数组，数组里面的类型是一个字典类型
                guard let array = result["statuses"] as? [[String : AnyObject]] else {
                    
                    //                数据没有加载出来也要进行一个回调，回调回去的数据就是一个空的
                    finished(statuses: nil)
                    print("数据解析有误")
                    
                    return
                }
                
                //            定义一个临时数组
                var list = [GDMHomeStatusModel]()
                //            下面是数据没有误的，所以进行一个解析
                //            遍历数组，拿到里面的每一个字典
                for item in array {
                    
                    //                开始进行字典转模型
                    let s = GDMHomeStatusModel(dict: item)
                    
                    //                把取出来的内容放到那个临时数组中
                    list.append(s)
                }
                
                //         拿到了这个数据，然后就要进行一个回调，在加载数据的时候进行一个回调
                //         把数据回调回去
                finished(statuses: list)
                
                }) { (_, error) -> Void in
                    
                    //                报错的时候也要回调回去
                    finished(statuses: nil)
                    print(error)
                    
            }
            
        }
    }
    
// MARK: - Table view data source
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

//        因为在上面的时候已经对这个数组进行了一个判断，所以在这就可以不用使用可选的类型了
        return statuses.count
        
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCellWithIdentifier(HomeCell, forIndexPath: indexPath) as! GDMHomeStatusesCell
        
//        现在的这一句把我自定义的cell 已经给盖起来了
//        cell.textLabel?.text = statuses[indexPath.row].text
        cell.homeStatuseModel = statuses[indexPath.row]
        
//        判断的时候就是在开始一个动画,为了避免不重复的上拉刷新，进行一个判断
        if indexPath.row == statuses.count - 1 && !indicatorView.isAnimating(){
            
            indicatorView.startAnimating()
            
//            加载数据
            loadData()
            
            print("静默加载")
        }
        
        return cell
        
    }

}
